package rothag.views.gamestep.endofgame;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import rothag.controller.MainController;
import rothag.graphics.GraphicsHelper;
import rothag.graphics.GraphicsParameters;
import rothag.models.JoueurInterface;
import rothag.models.PartieInterface;
import rothag.views.ImageJPanel;
import rothag.views.JButtonBase;
import rothag.views.gamestep.GameStepJPanelBase;

/**
 *
 * @author Gaetan
 */
public class FinPartieJPanel extends GameStepJPanelBase implements ActionListener {

    private JButtonBase menuPrincipal;
    private ImageJPanel imageJPanel;
    private ArrayList<JoueurInterface> listeJoueur;

    public FinPartieJPanel(MainController controller, ImageJPanel imageJPanel) {
        super(controller);

        this.imageJPanel = imageJPanel;

        // Bouton étape suivante
        menuPrincipal = new JButtonBase("Menu principal");
        menuPrincipal.setBounds(550, GraphicsParameters.smallFrameTopY + 60, 120, 40);
        menuPrincipal.addActionListener(this);
        add(menuPrincipal);

    }

    public void reset() {
        int classement;

        for (Component c : getComponents()) {
            if (c instanceof JLabel) {
                remove(c);
            }
        }

        // Récupération du classement
        listeJoueur = controller.getClassementJoueur();

        // Affichage
        if (listeJoueur.size() == 1) {
            try {
                classement = controller.ajoutScore();
            } catch (Exception ex) {
                GraphicsHelper.afficherErreur("Erreur", "Erreur lors de la lecture du fichier de sauvegarde. Veuillez supprimer le fichier savegame.rothag et réessayer.", this).setVisible(true);
                return;
            }

            Font font = GraphicsHelper.getFont(20, "bold");

            JLabel label = new JLabel("TOP 10");
            label.setFont(font);
            label.setForeground(Color.white);
            label.setHorizontalAlignment(SwingConstants.CENTER);
            label.setBounds(0, 60, largeur, 30);
            add(label);

            ArrayList<PartieInterface> topTen = null;

            try {
                topTen = controller.getTopTen();
            } catch (Exception ex) {
                GraphicsHelper.afficherErreur("Erreur", "Erreur lors de la lecture du fichier de sauvegarde. Veuillez supprimer le fichier savegame.rothag et réessayer.", this).setVisible(true);
                return;
            }

            int yLabel = 100;

            for (int i = 0; i < topTen.size(); i++) {
                JoueurInterface joueur = topTen.get(i).getListeJoueur().get(0);

                StringBuilder text = new StringBuilder();
                text.append(i + 1);
                text.append(" - ");
                text.append(joueur.getNom());
                text.append("  :  ");
                text.append(joueur.getScore());

                if (i + 1 == classement) {
                    font = GraphicsHelper.getFont(15, "bold");
                } else {
                    font = GraphicsHelper.getFont(13, null);
                }

                label = new JLabel(text.toString());
                label.setFont(font);
                label.setForeground(Color.white);
                label.setHorizontalAlignment(SwingConstants.CENTER);
                label.setBounds(0, yLabel, largeur, 25);
                add(label);

                yLabel += 25;
            }

            if (classement == -1) {
                yLabel += 10;

                ImageIcon img = GraphicsHelper.getImageIcon(GraphicsParameters.pathTraitConstruire, this);
                label = new JLabel(img);
                label.setBounds((largeur - img.getIconWidth()) / 2, yLabel, img.getIconWidth(), img.getIconHeight());
                add(label);

                yLabel += 10;

                font = GraphicsHelper.getFont(15, null);

                label = new JLabel("Vous n'êtes pas dans le top 10. Votre Score : " + listeJoueur.get(0).getScore());
                label.setFont(font);
                label.setForeground(Color.white);
                label.setHorizontalAlignment(SwingConstants.CENTER);
                label.setBounds(0, yLabel + 10, largeur, 25);
                add(label);
            }
        } else {
            Font font = GraphicsHelper.getFont(25, "bold");

            JLabel label = new JLabel("Partie terminée");
            label.setFont(font);
            label.setForeground(Color.white);
            label.setHorizontalAlignment(SwingConstants.CENTER);
            label.setBounds(0, 60, largeur, 100);
            add(label);

            ImageIcon img = GraphicsHelper.getImageIcon(GraphicsParameters.pathTraitConstruire, this);
            label = new JLabel(img);
            label.setBounds((largeur - img.getIconWidth()) / 2, 160, img.getIconWidth(), img.getIconHeight());
            add(label);

            int yLabel = 200;

            for (int i = 0; i < listeJoueur.size(); i++) {
                JoueurInterface joueur = listeJoueur.get(i);

                StringBuilder text = new StringBuilder();
                text.append(i + 1);
                text.append(" - ");
                text.append(joueur.getNom());
                text.append("  :  ");
                text.append(joueur.getScore());
                text.append(" (Ressources : ");
                text.append(joueur.getSommeRessource());
                text.append(")");

                if (i == 0) {
                    font = GraphicsHelper.getFont(25, "bold");
                } else if (i == 1) {
                    font = GraphicsHelper.getFont(20, null);
                }

                label = new JLabel(text.toString());
                label.setFont(font);
                label.setForeground(Color.white);
                label.setHorizontalAlignment(SwingConstants.CENTER);
                label.setBounds(0, yLabel, largeur, 40);
                add(label);

                yLabel += 40;
            }
        }
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == menuPrincipal) {
            boolean goTo = true;

            if (listeJoueur != null && listeJoueur.size() > 1) {
                JOptionPane pane = new JOptionPane("Voulez-vous sauvegarder le résultat de la partie ?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION);
                JDialog dialog = pane.createDialog(pane, "");
                dialog.setVisible(true);
                Integer valeur = (Integer) pane.getValue();

                if (valeur == JOptionPane.CANCEL_OPTION) {
                    goTo = false;
                } else if (valeur == JOptionPane.YES_OPTION) {
                    try {
                        controller.enregistrerPartie();
                        JOptionPane.showMessageDialog(this, "Enregistrement effectué.");
                    } catch (Exception ex) {
                        GraphicsHelper.afficherErreur("Erreur lors de la sauvegarde", "Erreur lors de la lecture du fichier de sauvegarde. Veuillez supprimer le fichier savegame.rothag et réessayer.", this).setVisible(true);
                    }
                }
            }

            if (goTo) {
                imageJPanel.setMode(ImageJPanel.MODE_MENU);
            }
        }
    }
}
